/* 
   programa para probar el puerto serie
   Envía ".,-" para ver la reccepción normar
   Envía "a" para activar el sincronismo
   Envía "b" para desactivar el sincronismo
   Envía "c" para activar el sincronismo, y poner el dato en reenviar
   Envía "x" para simular que está activa/desactivada la señal externa de 30 hercios
*/



#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <time.h>
#include <semaphore.h>
#include <errno.h>

#include "serial.h"
#include "PICdata.h"


/* \brief callback cada vez que se recibe un dato por el puerto serie
 * \param datorx Dato recibido por el puerto
 * \param datorx Dato que había sido enviado, y que está esperando confirmación median el ACK
 * \param p Estructura de datos de la interfaz de control del puerto
 * \param params Datos adicionales pasados al callback
 * \return true si se quiere según con el hilo de recepción de datos. false para cancelar el hilo
 */
bool datos_recibido(unsigned char datorx, unsigned char datotx, serial_params_t *p, void *params)
{
    if ((datorx & FORMAT_CAB) == PICCAB_MODE)
    {  //se envió un dato de petición de sincronismo
	if (datorx & 0x1)
	    printf("Sync signal ON\n");
	else 
	    printf ("Sync signal OFF\n");

	// sepone el último bit a '0' para que no de error la comprobación del ack
	datotx &= 0xFE;
	datorx &= 0xFE;
    }

    //comprueba que el dato recibido es el correcto. el PIC reenvía el dato recibido
    if (datotx != datorx)
	printf("%c Error de Ack. received %c\n", datotx, datorx);
#ifdef DEBUG_SHOW_DATA
    else
	printf("%c ack OK\n", datotx);
#endif

    //true porque se quiere que siga activo el hilo de recepción
    return true;
}


// ejemplo de llamadas a funciones de uso del interfaz de control del puerto serie
int main()
{
    //estructura de datos del puerto serie, que inicializará empezar_lectura_serialport
    serial_params_t serial_params, *p;
    p = &serial_params;
    
    //abre el puerto e inicializa todos los datos
    if (!empezar_lectura_serialport(p, "/dev/ttyUSB0"))
    {
	printf("Error en el puerto\n");
	//exit(-1);
    }

    //indica la funcion de llamada al recibir datos
    p->callback_rx = datos_recibido;
    //parámetros a pasar a la función callback de recibir datos
    p->params = NULL;

    //cuando se quiere establecer un dato para retransmisión
    //set_dato_reenviar(p, dato);
    //cuando se quiere quitar el dato para retransmisión
    //set_dato_reenviar(p, 0);

    //basurilla para probar el puerto
    unsigned char key, dato;
    int next_reenviar =0;

    Write_Port_buffer(p, PICCAB_MODE | PICCAB_HARD_RESET);


    while(key != 'q')
    {
	key = (unsigned char)getchar();
	if (key != '\n' && key != '\r')
	{


	    if (key == '1' && next_reenviar != 1)
	    {
		next_reenviar = 1;
	    }
	    else if (key == '0')
	    {
		set_dato_reenviar(p, 0);
		next_reenviar = 0;
	    }
	    else
	    {
		switch(key)
		{
		case 'd':
		    dato = PICCAB_MODE | PICCAB_EXT_SYNC_OFF;
		    printf("PICCAB_EXT_SYNC_OFF. ");
		    break;
		case 'e':
		    dato = PICCAB_MODE | PICCAB_EXT_SYNC_ON;
		    printf("PICCAB_EXT_SYNC_ON. ");
		    break;
		case 'c':
		    dato = PICCAB_MODE | PICCAB_CAM_SYNC_ON;
		    printf("PICCAB_CAM_SYNC_ON. ");
		    break;
		case 'i':
		    dato = PICCAB_MODE | PICCAB_IR_ON;
		    printf("PICCAB_IR_ON. ");
		    break;
		case 'k':
		    dato = PICCAB_MODE | PICCAB_IR_OFF;
		    printf("PICCAB_IR_OFF. ");
		    break;
		case 'z':
		    dato = PICCAB_MODE | PICCAB_EXT_SYNC_SIM_ON;
		    printf("PICCAB_EXT_SYNC_SIM_ON. ");
		    break;
		case 'x':
		    dato = PICCAB_MODE | PICCAB_EXT_SYNC_SIM_OFF;
		    printf("PICCAB_EXT_SYNC_SIM_OFF. ");
		    break;
		case 'r':
		    dato = PICCAB_MODE | PICCAB_HARD_RESET;
		    printf("PICCAB_HARD_RESET. ");
		    break;
		case 'p':
		    dato = PICCAB_PWM_VALUE | (FORMAT_DATA & (unsigned char)getchar());
		    printf("PICCAB_PWM_VALUE. ");
		    break;
		case 's':
		    dato = PICCAB_SHUTTER_TIME | (FORMAT_DATA & (unsigned char)getchar());
		    printf("PICCAB_SHUTTER_TIME. ");
		    break;
		default:
		    dato = key;
		    printf("other. ");
		    break;
		}
		Write_Port_buffer(p, dato, next_reenviar);
		next_reenviar = 0;
	    }
	}
    }
    
    //antes de acabar el programa
    terminar_lectura_serialport(p);
        
    return 0;
}


